git使用

原文链接

git安装不再说明

git OSX版,windows版,Linux版

使用桌面版本(推荐)

GitHub Desktop管理项目

创建一个新仓库

# 创建一个文件夹
mkdir dir_name

# 进入文件夹
cd dir_name

# 执行命令创建一个新的仓库,当前目录下
git init

# 直接新建一个仓库
git init <project-name>

在windows下git文件是隐藏的

在github上创建一个新仓库

cd test

git init

# 创建一个readme.md文件并写入一个标题hello git
echo "# hello git" >README.md

# 添加文件进入缓存并提交
git add .
git commit -m "first commit"

# 接下来可以提交到远程服务器上

n71SVs.png

克隆一个仓库

# 克隆一个本地仓库
git clone /path/to/repository

# 克隆一个远程服务器上的仓库(常用)
git clone username@host:/path/to/repository
git clone <url>

git的工作流

本地仓库由git维护的3颗“树”组成。

  1. 工作目录(Working):拥有实际文件

  2. 缓存区(Index):临时保存你的改动

  3. HEAD :指向最近一次提交的结果

  • HEAD(头) HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点。 通常,理解 HEAD 的最简方式,就是将它看做 你的上一次提交 的快照
  • Index (索引) 也可以被认为是staging area(暂存区),是一堆将在下一次commit中提交的文件,提交之后,它就是HEAD的父节点(git add添加的文件)
  • working copy (工作副本) 当前工作目录下的文件(一般指,有修改,没有git add,没有git commit的文件)

添加与提交

# 添加计划改动到缓存区
git add <filename>
git add .

# 提交实际改动到HEAD
git commit -m "代码提交的信息说明"

# 提交时显示所有信息
git commit -v

# 提交自上次提交后的变化直接到仓库区
git commit -a

推送改动

# 从HEAD 推动到远程仓库
git push origin master(master可以更换为想要推送到的任何分支)

# 没有克隆现有的仓库,要连接到某个远程服务器可以使用
# 将改动推送到添加的服务器上
git remote add origin <server>

# 强制推送当前分支到远程仓库,即使冲突
git push origin <remote>  -f

分支创建切换删除

创建仓库时,默认的分支是master

# 创建一个新命名为 feature_x 的分支
# 并从master 切换过去
git checkout -b feature_x

# 切换回master
git checkout master

# 列出所有分支
git branch <-r:所有远程分支> <-a:所有远程和本地>

# 删除分支
git branch -d feature_x

# 可以将该分支推送到远程服务器
# 否则仅为你自己可见
git push origin <branch>

更新和合并(拉取)

# 更新本地仓库到最新改动
git pull 

# 显示所有远程仓库
git remote -v

# 合并其他分支到当前分支
git merge <branch>

git会尝试自动合并改动,但有可能不成功

出现冲突,需要手动修改文件合并

# 修改完毕后添加
git add <filename>

# 合并前查看改动 源分支和目标分支
git diff <source_branch> <target_branch>

恢复(重置)

重置(重置到这次提交)

# 替换本地改动
# 将使用HEAD的最新内容替换掉工作目录的文件
# 但是添加到缓存区的改动和新文件不受影响
git checkout -- <filename>
git checkout -- .(多个文件)


# 丢弃所有本地改动和提交
# 从服务器上获取最新的版本
# 将本地分支指向服务器 
git fetch origin
git reset --hard origin/master

# 从暂存区撤销

# 回滚到指定的HEAD 
# (某次提交,该提交后的所有提交会被回滚或者说不再存在,不可逆)
# 尽量不使用 reset
git reset --hard <HEAD 从日志获取指定的HEAD commit_id>

# 并强制推送到 master
git push -f origin master


# 重置暂存区指定文件与上次提交保持一样,不改变工作区
git reset <filename>

# 重置暂存区和工作区和上次提交保持一致
git reset --hard 

# 重置当前分支到指定提交,同时重置暂存区和工作区
git reset --hard <commit_id>

# 重置当前HEAD为指定的提交,但保持暂存区和工作区不变
git reset --keep <commit_id>

恢复(提交回滚)

# 新建一个提交,用以撤销指定的提交
# 相当于用一个新的替换旧的提交,保持其他的记录
git revert <commit_id>

git reset 与 git revert的区别

重置,reset是一次重置操作,不可逆(其实还有版本穿梭,查看reflog再重置回去),HEAD 的长度会直接消退到某次重置的地方,相当于放弃后面的所有提交

恢复,是一个新覆盖操作,HEAD 会向后添加一个恢复提交用以覆盖之前指定的提交,相当于用一个新的提交覆盖指定的提交,其他的提交记录仍然存在。

标签

# 在当前提交,添加一个v1.0.0标签
git tag -a v1.0.0 -m "msg"

# 给指定提交添加
git tag v1.0.0 <commit>

# 查看 tag
git tag

# 删除
git tag -d v1.0.0

查看信息

日志部分

# 显示有变更的文件
git status

# 显示当前分支版本历史
git log

# 显示提交历史和每次提交发生变更的文件
git log --stat

# 根据关键词搜索提交历史
git log -S <keyword>

# 显示某次提交之后的变动,每个提交占据一行
git log <tag> HEAD --pretty=format:%s

# 显示符合提交说明的,某个提交之后的变动
git log <tag> HEAD --grep feature

# 显示某个文件的版本历史,包括文件重命名
git log --follow <filename>
git whatchanged <filename>

# 显示指定文件相关的每次diff
git log -p <filename>

# 显示过去几次的提交比如10次
git log -10 --pretty --oneline

# 显示所有提交过的用户,以提交次数排序
git shortlog -sn

# 显示指定文件是什么人什么时候修改过
git blame <filename>

差异查看


# 显示暂存区和工作区的差异
git diff

# 显示暂存区和上一个commit的差异
git diff --cached <filename>

# 显示两次提交之间的差异
git diff <first_branch> <second_branch>

# 显示今天写了多少代码
git diff --shortstat "@{0 day ago}"

查看提交

# 显示某次提交发送变化的文件
git show <commit_id>

# 显示某次提交发送变化的文件
git show --name-only <commit_id>

# 显示某次提交某个文件的内容
git show <commit_id>:<filename>

# 显示当前分支最近的提交
git reflog

配置

设置提交代码时的用户信息
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"

.gitignore文件

用以指定要忽略的文件,在提交项目的时候。而不是把所有目录下的文件都提交。

格式

注释: #

使用通配符指定
*.txt: 忽略所有.txt文件
!hello.txt: 不忽略hello.txt

忽略指定目录的文件
/text:忽略根目录下的text文件
docx/*.docx:忽略docx下的所有.docx文件

dist/:忽略所有dist目录下的文件
....等等

github上整理了一些项目的相关.gitignore文件配置

链接在这里

将需要的忽略文件重新命名为.gitignore就好。

通过gitignore.io 创建

gitignore.io地址

自定义终端命令

https://docs.gitignore.io/install/command-line

获取对应的终端命令

使用自定义命令

# 获得针对node 项目的.gitignore文件
gi node > .gitignore


奖励一下